package com.lj.infoisland.domain.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.*;

/*
 * @description 新闻评论DTO
 * @author 龙洁
 * @create 2024-10-27 上午11:19
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommentDTO {

    private Integer id;

    /**
     * 新闻id
     */
    private String newsId;

    /**
     * 用户唯一标识
     */
    private String userUniqueId;

    /**
     * 用户名
     */
    private String username;

    /**
     * 头像url
     */
    private String avatarUrl;


    /**
     * 父级评论id，用于实现多级评论
     */
    private Long parentId;

    /**
     * 评论目标，用于实现回复功能
     */
    private String target;

    /**
     * 评论内容
     */
    private String content;

    private boolean iscomment = false;

    /**
     * 评论时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm")
    private Date createdAt;

    /**
     * 子评论
     */
    private List<CommentDTO> children;

    public static List<CommentDTO> buildCommentTree(List<CommentDTO> commentDTOList) {
        if (commentDTOList == null) {
            return null;
        }

        // 创建一个映射，用于快速查找parentId对应的CommentDto
        Map<Long, CommentDTO> commentMap = new HashMap<>();
        for (CommentDTO commentDto : commentDTOList) {
            commentMap.put(Long.valueOf(commentDto.getId()), commentDto);
        }

        // 创建一个列表来存储顶层评论
        List<CommentDTO> rootComments = new ArrayList<>();

        for (CommentDTO commentDto : commentDTOList) {
            Long parentId = commentDto.getParentId();
            if (parentId == null) {
                // 如果没有父级，则是顶层评论
                rootComments.add(commentDto);
            } else {
                // 如果有父级，找到父级CommentDto并添加当前CommentDto到其children列表
                CommentDTO parentComment = commentMap.get(parentId);
                if (parentComment != null) {
                    List<CommentDTO> children = parentComment.getChildren();
                    if (children == null) {
                        children = new ArrayList<>();
                        parentComment.setChildren(children);
                    }
                    children.add(commentDto);
                }
            }
        }

        return rootComments;
    }
}
